micropython开发lvgl教程

您所在的位置:网站首页 micropython 库 micropython开发lvgl教程

micropython开发lvgl教程

2023-06-15 02:31| 来源: 网络整理| 查看: 265

前言

为什么要使用micropython来开发lvgl而不是用c? 当然在资源非常受限的芯片比如单片机上c开发会是很好的选择,或者对于某些不喜欢mpy解释器特性的也不适合。这些都不是本教程谈论的重点,我们先来看看使用micropython开发起来有何不同。

我们先来看看lvgl官网关于这个的介绍:https://docs.lvgl.io/master/get-started/micropython.html https://blog.lvgl.io/2019-02-20/micropython-bindings 截取其中提到的一些要点(google网页翻译内容): 在这里插入图片描述 lvgl官网也做了在线模拟器支持:

如果您想在不下载任何东西的情况下尝试LVGL + Micropython - 您可以使用我们的在线模拟器! 它是一个功能齐全的LVGL + Micropython,完全在浏览器中运行,并允许您编辑python脚本并运行它。 单击此处在在线模拟器上进行实验

这个是基于micropython 的js移植实现的,所以在模拟器上跑的py代码我们也可以移植到板子上来运行,只需要更改驱动部分代码适配自己的板子即可。

unix移植上的开发

关于支持lvgl的micropython固件编译可以参考我之前的文章: 支持LVGL的micropython固件编译(一) 支持LVGL的micropython固件编译(二)arm板移植 下面以芒果派麻雀板(全志D1s芯片,risc-v架构)为例来讲下如何在linux上使用mpy开发lvgl应用。 移植好的芒果派麻雀板的mpy解释器,以及相关例子都维护在了我的仓库中:https://gitee.com/l_y_r/micropython_lvgl_example/tree/master 可以参考仓库里的例子自行实践。

micropython的命令行选项

要开发首先要熟悉下mpy解释器,先贴出官方的相关文档 UNIX 和 Windows 端口的快速参考 以下几个要点需要注意:

-i参数主要用来在运行脚本后调试使用,进本执行后会进入repl模式下,此时可以通过tab键补全查看到脚本中导入的所有对象,并可调用代码,动态更改运行。mpy固件默认是1M的内存堆栈大小,如果写的py程序内存占用过多,可以使用-X heapsize=8M指令来改到8M大小执行脚本,当然改成其他大小也可以。同python一样mpy也有外部模组引用路径,默认的搜索路径为~/.micropython/lib:/usr/lib/micropython,我们可以通过设置MICROPYPATH环境变量来覆盖搜索路径。在linux端口上可能会遇到mpy固件内置的py模组无法import 问题,可以通过在脚本开头加以下代码解决:# Workaround for including frozen modules when running micropython with a script argument # https://github.com/micropython/micropython/issues/6419 import usys as sys sys.path.append('') unix端口上lvgl显示以及输入设备驱动

linux上通常使用fb来驱动屏幕显示,另外也有drm,在ubuntu等发行版上会使用sdl库封装来提供给上层操作的接口。 我们的mpy解释器从https://github.com/lvgl/lv_micropython移植而来,在该工程中也包含了驱动模组以及使用例程,路径如下:

lib/lv_bindings/driver/linux: linux的驱动输入以及fb显示驱动(已经内置到解释器)lib/lv_bindings/lib: 其他依赖库(按需选择)lib/lv_bindings/examples: 使用例程 简单的例子

我的仓库中https://gitee.com/l_y_r/micropython_lvgl_example/tree/master 写好了fb_test.py 可以参考实现。 其中同时注册了鼠标以及触摸输入驱动

mouse = evdev.mouse_indev(scr) mouse = evdev.tp_indev(scr,device='/dev/input/event2')

两种输入设备可以同时工作。

lvgl的深入开发

基本的概念有了,想要实现更多调整怎么办呢?比如更改某个控件颜色,大小,位置等等。 如果你对c开发lvgl很熟悉,那么很简单,由于mpy版的lvgl模组就是通过lvgl的c代码自动化封装而来,所以在函数接口名称上格式基本一致,参数上也是一样的,区别在于c以面向对象模式开发,第一个参数为对象指针,而在对应的mpy接口中,这个参数省略,因为本身就携带了对象。c函数封装为mpy模组的中间文件在这里:lib/lv_bindings/gen/lv_mpy_example.c,从这个文件里找到mpy函数接口所对应的c接口。 看下面一个例子: 控件对齐函数 c中接口为

void lv_obj_align(lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs) { lv_obj_set_style_align(obj, align, 0); lv_obj_set_pos(obj, x_ofs, y_ofs); }

mpy封装中间层c中接口为:

/* * lvgl extension definition for: * void lv_obj_align(struct _lv_obj_t *obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs) */ STATIC mp_obj_t mp_lv_obj_align(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr) { struct _lv_obj_t *obj = mp_to_lv(mp_args[0]); lv_align_t align = (uint8_t)mp_obj_get_int(mp_args[1]); lv_coord_t x_ofs = (int16_t)mp_obj_get_int(mp_args[2]); lv_coord_t y_ofs = (int16_t)mp_obj_get_int(mp_args[3]); ((void (*)(struct _lv_obj_t *, lv_align_t, lv_coord_t, lv_coord_t))lv_func_ptr)(obj, align, x_ofs, y_ofs); return mp_const_none; } STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_align_obj, 4, mp_lv_obj_align, lv_obj_align);

mpy应用层使用例子:

import lvgl as lv scr = lv.obj() btn = lv.btn(scr) btn.align(lv.ALIGN.CENTER, 0, 0)

scr与btn都是一个lvgl obj,align是基于这个对象实例去调用接口的,只需要传入3个参数:对齐方向,x偏移,y偏移。 所以说就api使用来看,看C接口文档同样适用于mpy开发。官方的api文档位于:https://docs.lvgl.io/master/widgets/index.html

如果你对开发lvgl毫无经验也没有关系,可以直接参考官方的例子实现,对于mpy使用各个部件基本都做了例子:https://docs.lvgl.io/master/examples.html。 另外进入mpy的repl模式下导入lvgl也可以使用tab补全的方式查看每个对象可以使用的函数接口 在这里插入图片描述

lvgl的设计器使用:EdgeLine,SquareLine

目前lvgl设计器(EdgeLine)还处在测试阶段v0.3版本,可以从这里下载体验:https://download.csdn.net/download/qq_34440409/21458254?spm=1001.2014.3001.5503 使用设计器布局完成后可以导出mpy代码文件,导出的代码是lvgl7版本。 然后增加显示,输入驱动代码即可。

正式版本1.0已经在2022年2月8号发布,改名为SquareLine,目前释放了付费版本,预计免费版还要过段时间才会放出,不过这个付费版有30天的免费体验时间,没有限制,无需注册,安装包下载链接: https://download.csdn.net/download/qq_34440409/79838814 该版本基于lvgl8.2,可以导出c或micropython代码。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3